package io.openim.android.ouicore.base.vm.injection;

import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelStoreOwner;

public class Easy {
    public static <T extends BaseVM> T put(T dependency) {
        return put(dependency, null);
    }

    public static <T extends BaseVM> T put(T dependency, String tag) {
        return EasyInstance.inst().put(dependency, tag);
    }

    public static <T extends BaseVM> T find(Class<T> dependency) {
        return find(dependency, null);
    }

    public static <T extends BaseVM> T find(Class<T> dependency, String tag) {
        return EasyInstance.inst().find(dependency, tag);
    }

    public static <T extends BaseVM> Boolean delete(Class<T> dependency) {
        return delete(dependency, null);
    }

    public static <T extends BaseVM> Boolean delete(Class<T> dependency, String tag) {
        return EasyInstance.inst().delete(dependency, tag);
    }


    /**
     * global use this
     *
     * @param dependency
     * @param <T>
     * @return
     */
    public static <T extends BaseVM> T installVM(Class<T> dependency) {
        return installVM(null, dependency, null);
    }

    public static <T extends BaseVM> T installVM(Class<T> dependency, String tag) {
        return installVM(null, dependency, tag);
    }
    /**
     * single activity use this
     *
     * @param owner
     * @param dependency
     * @param <T>
     * @return
     */
    public static <T extends BaseVM> T installVM(ViewModelStoreOwner owner, Class<T> dependency) {
        return installVM(owner, dependency, null);
    }

    /**
     * 该函数用于根据传入的参数在指定的ViewModelStoreOwner中安装并返回一个ViewModel实例。
     * 函数使用了泛型<T extends BaseVM>，表示返回的ViewModel类型是BaseVM的子类。
     * 参数owner表示要安装ViewModel的ViewModelStoreOwner对象，如果为null，则表示安装全局的ViewModel。
     * 参数dependency表示ViewModel的类类型。
     * 参数tag表示ViewModel的标签，用于在全局中查找或指定ViewModel的名称。
     * 如果owner为null，表示安装全局的ViewModel：
     * 尝试通过Easy.find(dependency, tag)方法查找并返回已存在的ViewModel实例。
     * 如果查找失败，则通过dependency.newInstance()创建一个新的ViewModel实例，并通过Easy.put(vm, tag)方法将其注册为全局的ViewModel。
     * 如果owner不为null，则根据tag是否为null来选择不同的方式安装ViewModel：
     * 如果tag为null，则通过new ViewModelProvider(owner).get(dependency)方法创建并返回一个新的ViewModel实例。
     * 如果tag不为null，则通过new ViewModelProvider(owner).get(tag, dependency)方法创建并返回一个新的ViewModel实例。
     */

    public static <T extends BaseVM> T installVM(ViewModelStoreOwner owner, Class<T> dependency,
                                                 String tag) {
        T vm;
        if (null == owner) {
            //global
           try {
              return Easy.find(dependency,tag);
           }catch (Exception e){
               try {
                   vm = dependency.newInstance();
                   Easy.put(vm, tag);
               } catch (IllegalAccessException | InstantiationException ex) {
                   throw new RuntimeException(ex);
               }
           }
        } else {
            if (null == tag)
                vm = new ViewModelProvider(owner).get(dependency);
            else
                vm = new ViewModelProvider(owner).get(tag, dependency);
        }
        return vm;
    }
}
